﻿/*
 * 由SharpDevelop创建。
 * 用户： rong
 * 日期: 2015-01-21
 * 时间: 20:49
 * 
 * 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件
 */


using System;

using System.Runtime.InteropServices;

using System.Text;

using System.IO ;

using System.Windows.Forms;

namespace MP3player

{

	/// <summary>

	/// clsMci 的摘要说明。
	/// clsMCI cm = new clsMCI();
    /// cm.FileName = "别看我只是一只羊.mp3";
    /// cm.play();
	///
	
	

	/// </summary>

	public class clsMCI

	{

		public clsMCI()

		{

//

			// TODO: 在此处添加构造函数逻辑

//

		}



		//定义API函数使用的字符串变量

		[MarshalAs(UnmanagedType.ByValTStr,SizeConst=260)]

		private string Name = "" ;

		[MarshalAs(UnmanagedType.ByValTStr,SizeConst=128)]

		private string durLength = "" ;

		[MarshalAs(UnmanagedType.LPTStr,SizeConst=128)]

		private string TemStr ="";

		int ilong;

		//定义播放状态枚举变量

		public enum State

		{

			mPlaying = 1,

			mPuase = 2,

			mStop = 3

		};

		//结构变量

		public struct structMCI

		{

			public bool bMut;

			public int iDur;

			public int iPos;

			public int iVol;

			public int iBal;

			public string iName;

			public State state;

		};



		public structMCI mc =new structMCI() ;



		//取得播放文件属性

		public string FileName

		{

			get

			{

				return mc.iName;

			}

			set

			{

				//ASCIIEncoding asc = new ASCIIEncoding();

				try

				{

					TemStr ="";

					TemStr = TemStr.PadLeft(127,Convert.ToChar(" "));

					Name = Name.PadLeft(260,Convert.ToChar(" ")) ;

					mc.iName = value;

					ilong = APIClass.GetShortPathName(mc.iName,Name, Name.Length);

					Name = GetCurrPath(Name);

					//Name = "open " + Convert.ToChar(34) + Name + Convert.ToChar(34) + " alias media";

					Name = "open " + Convert.ToChar(34) + Name + Convert.ToChar(34) + " alias media";

					ilong = APIClass.mciSendString("close all", TemStr, TemStr.Length , 0);

					ilong = APIClass.mciSendString( Name, TemStr, TemStr.Length, 0);

					ilong = APIClass.mciSendString("set media time format milliseconds", TemStr, TemStr.Length , 0);

					mc.state = State.mStop;

				}

				catch

				{

				}

			}

		}

		//播放

		public void play()

		{

			TemStr = "";

			TemStr = TemStr.PadLeft(127,Convert.ToChar(" "));

			APIClass.mciSendString("play media", TemStr, TemStr.Length , 0);

			mc.state = State.mPlaying ;

		}

		//停止

		public void StopT()

		{

			TemStr = "";

			TemStr = TemStr.PadLeft(128,Convert.ToChar(" "));

			ilong = APIClass.mciSendString("close media", TemStr, 128, 0);

			ilong = APIClass.mciSendString("close all", TemStr, 128, 0);

			mc.state = State.mStop ;

		}



		public void Puase()

		{

			TemStr = "";

			TemStr = TemStr.PadLeft(128,Convert.ToChar(" "));

			ilong = APIClass.mciSendString("pause media", TemStr, TemStr.Length, 0);

			mc.state = State.mPuase ;

		}

		private string GetCurrPath(string name)

		{

			if(name.Length <1) return "";

			name = name.Trim();

			name = name.Substring(0,name.Length-1);

			return name;

		}

		//总时间

		public int Duration

		{

			get

			{

				durLength = "";

				durLength = durLength.PadLeft(128,Convert.ToChar(" ")) ;

				APIClass.mciSendString("status media length", durLength, durLength.Length, 0);

				durLength = durLength.Trim();

				if(durLength == "") return 0;

				return (int)(Convert.ToDouble(durLength) / 1000f);

			}

		}



		//当前时间

		public int CurrentPosition

		{

			get

			{

				durLength = "";

				durLength = durLength.PadLeft(128,Convert.ToChar(" ")) ;

				APIClass.mciSendString("status media position", durLength, durLength.Length, 0);

				mc.iPos = (int)(Convert.ToDouble(durLength) / 1000f);

				return mc.iPos;

			}

		}

	}



	public class APIClass

	{

		[DllImport("kernel32.dll", CharSet = CharSet.Auto)]

		public static extern int GetShortPathName (

			string lpszLongPath,

			string shortFile,

			int cchBuffer

		);



		[DllImport("winmm.dll", EntryPoint="mciSendString", CharSet = CharSet.Auto)]

		public static extern int mciSendString (

			string lpstrCommand,

			string lpstrReturnString,

			int uReturnLength,

			int hwndCallback

		);

	}

}